//
//  UITextView + Extension.swift
//  1026SwiftSinaWeiBo
//
//  Created by Apple on 15/11/6.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit


extension UITextView {

    ///插入emoji表情
    func insertEmoji(emoji: ZDEmoji) {
        
        //如果点击的是删除按钮
        if emoji.removeBtn {
            
            //删除textView中的表情
            deleteBackward()
            
            return
        }
        
        //如果选中的是默认emoji表情(本质上就是字符串)，可以直接插入
        if let text = emoji.emojiString {
            
            insertText(text)
            
            return
        }
        
//        //如果选中的是图片表情
//        guard let imagePath = emoji.pngPath else {
//            
//            return
//        }
        
//        //取出表情图片
//        let image = UIImage(contentsOfFile: imagePath)
//        
//        //创建附件
//        let attachment = ZDTextAttachment()
//        //保存图片对应的字段
//        attachment.name = emoji.chs
//        
//        //设置附件的图片为表情图片
//        attachment.image = image;
//        
//        //获取线高
//        let height = font?.lineHeight ?? 10
//        
//        //设置附件图片的大小
//        attachment.bounds = CGRect(x: 0, y: -height * 0.25, width: height, height: height)
//        
//        //创建带附件的属性文本
//        let attributeStr = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
//        
//        //设置表情属性文本的字体 ———— 解决重复输入表情图片时，后面的表情图片变小的bug(后面输入的属性文本font参考其前一个属性文本，如果没有设置就是默认值)
//        attributeStr.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
        
        //返回带表情图片的属性文本
        let attributeStr = emoji.emojiToAttributeString(font!)
        
        //获取textView的现有属性文本 转换为可变的属性文本
        let attributeStrM = NSMutableAttributedString(attributedString: attributedText)
        
        //获取textView当前选中文本的范围
        let range = selectedRange
        
        //将选中的文本替换为带有表情图片的属性文本
        attributeStrM.replaceCharactersInRange(range, withAttributedString: attributeStr)
        
        //将最终的属性文本重新设置给textView的属性文本
        attributedText = attributeStrM
        
        //重新定位光标的位置 否则设置完属性文本后 光标自动跑到最后
        selectedRange = NSMakeRange(range.location+attributeStr.length, 0)
        
        /* 由于插入emoji表情图片不会触发textView的代理和通知 所以这里手动来触发 */

        //发通知
        NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
    }

    
    ///获取emoji字符串
    func emojiText() -> String {
    
        //获取textView的文本内容 ———— 希望的效果：hello [笑哈哈] world 即表情图片转换为对应的字段，服务器能够识别
        //        print(textView?.text)    //不能显示表情图片
        //        print(textView?.attributedText)   //显示的东西不是我们想要的
        
        var text: String = ""
        
        //遍历属性文本
        attributedText.enumerateAttributesInRange(NSMakeRange(0, attributedText.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (dict, range, _) -> Void in
            
            //            print(dict)
            //            print(range)
            
            if let textAttachment = dict["NSAttachment"] as? ZDTextAttachment {
                
                //获取表情图片对应的字段
                text += textAttachment.name!
                
            }else {
                
                //截取字符串
                let string = (self.attributedText.string as NSString).substringWithRange(range)
                
                text += string
            }
        }
        
        return text
    }
    
}